package com.yzh.chatgpt.interceptor;

import cn.hutool.http.ContentType;
import cn.hutool.http.Header;
import okhttp3.HttpUrl;
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;
import org.jetbrains.annotations.NotNull;

import java.io.IOException;

/**
 * 自定义拦截器（OKHttp3）
 */
public class ChatInterceptor implements Interceptor {
    /**
     * ChatGPT官网申请
     */
    private String apiKey;
    /**
     * 用户鉴权Token
     */
    private String authToken;

    public ChatInterceptor(String apiKey, String authToken) {
        this.apiKey = apiKey;
        this.authToken = authToken;
    }

    /**
     * 修改原始请求
     * @param apiKey
     * @param original
     * @return
     */
    private Request auth(String apiKey, Request original) {
        //获取原始请求的url，并在url后设置查询信息token，如果没有鉴权要求是不需要设置的
        HttpUrl url = original.url().newBuilder()
                .addQueryParameter("token", authToken)
                .build();
        //构建新的请求器
        return original.newBuilder()
                //使用修改后的url
                .url(url)
                //设置身份验证头，携带ChatGPT的apiKey
                .header(Header.AUTHORIZATION.getValue(), "Bearer " + apiKey)
                //设置传输格式为json
                .header(Header.CONTENT_TYPE.getValue(), ContentType.JSON.getValue())
                //设置请求方法，使用原始请求的方法和主体
                .method(original.method(), original.body())
                .build();
    }

    /**
     * 拦截器方法：将apiKey和原始请求传递给auth方法
     * @param chain 代表了请求和响应的处理链
     * @return
     * @throws IOException
     */
    @NotNull
    @Override
    public Response intercept(Chain chain) throws IOException {
        return chain.proceed(this.auth(apiKey, chain.request()));

    }
}
